#ifndef _app_manager_app_H__
#define _app_manager_app_H__

#ifdef __cplusplus
extern "C"
{
#endif

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "app_manager_type.h"

#if APP_MANAGER_LIB_ENABLE

    /**
     * @brief 初始化app配置结构体
     *
     * @param app
     * @return app_manager_ret_t
     */
    app_manager_ret_t app_manager_config_struct_init(app_register_t *app);

    /**
     * @brief 注册app
     *
     * @param app
     * @return app_manager_ret_t
     */
    app_manager_ret_t app_manager_register_app(app_register_t *app);

    /**
     * @brief 注销app
     *
     * @param app_name app名称
     * @return app_manager_ret_t
     */
    app_manager_ret_t app_manager_unregister_app(const char *app_name);

#if 0
    /**
     * @brief 获取已经卸载的app数量
     *
     * @return uint8_t
     */
    uint8_t app_manager_get_save_uninstalled_number();

    /**
     * @brief 获取已经卸载的app名称
     *
     * @param app_id
     * @param app_name
     * @return app_manager_ret_t
     */
    app_manager_ret_t app_manager_get_save_uninstalled_name(uint8_t app_id, char *app_name);
#endif

    /**
     * @brief 打开app
     *
     * @param app_id app的编号，和name二选一，name优先
     * @param app_name app的名字，和id二选一，name优先，不使用填NULL
     * @param anim 指向自定义GUI库的动画类型
     * @param time 加载时长
     * @param delay 加载延迟
     * @return app_manager_ret_t
     */
    app_manager_ret_t app_manager_open(uint8_t app_id, const char *app_name, void *anim, uint16_t time, uint16_t delay);

    /**
     * @brief 打开app
     *
     * @param app_id app的编号，和name二选一，name优先
     * @param app_name app的名字，和id二选一，name优先，不使用填NULL
     * @param anim 指向自定义GUI库的动画类型
     * @param time 加载时长
     * @param delay 加载延迟
     * @param userdata 要传递给需要打开的app的数据
     * @return app_manager_ret_t
     */
    app_manager_ret_t app_manager_open_with_userdata(uint8_t app_id, const char *app_name, void *anim, uint16_t time, uint16_t delay, void *userdata);

    /**
     * @brief 获取前台程序
     *
     * @return app_register_t*
     */
    app_register_t *app_manager_get_forground_app();

    /**
     * @brief 获取已经安装的应用数量
     *
     * @return uint8_t
     */
    uint8_t app_manager_get_installed_number();

    /**
     * @brief 获取已经安装的app数据
     *
     * @param app_id 0-N
     * @return app_register_t*
     */
    app_register_t *app_manager_get_installed_app(uint8_t app_id, const char *app_name);

    /**
     * @brief 获取指定名称的app的注册id
     *
     * @param name
     * @return uint8_t 0-254,没找到app返回255
     */
    uint8_t app_manager_get_installed_app_id(const char *name);

#if APP_MANAGER_ENABLE_APP_UNINSTALL
    /**
     * @brief 获取已经卸载的app名称
     *
     * @return uint8_t
     */
    uint8_t app_manager_get_uninstalled_number();

    /**
     * @brief 获取已经卸载的app数据
     *
     * @param app_id
     * @return app_register_t*
     */
    app_register_t *app_manager_get_uninstalled_app(uint8_t app_id, const char *app_name);
#endif // APP_MANAGER_ENABLE_APP_UNINSTALL

#endif // APP_MANAGER_LIB_ENABLE

#ifdef __cplusplus
}
#endif

#endif // ifndef _app_manager_app_H__
